<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // function Student(name,age){
        //     this.name=name;
        //     this.age=age;
        //     this.show=function(){
        //         console.log("我是一个学生，我的名字："+this.name+",年龄："+this.age);
        //     };
        //     this.sayHello=function(){
        //         console.log("我是一个学生");
        //     };
        //     this.sayGoodBye=function(){
        //         console.log("再见，熊熊");
        //     };
        // }
        // var stu1=new Student("alice",20);
        // stu1.show();
        // stu1.sayHello();
        // stu1.sayGoodBye();
        // var stu2=new Student("alice",20);
        // stu2.show();
        // stu2.sayHello();
        // stu2.sayGoodBye();
        // console.log(stu1===stu2);//false
        // console.log(stu1.name===stu2.name);//true
        // console.log(stu1.sayHello===stu2.sayHello);//false
        // console.log(stu1.sayGoodBye===stu2.sayGoodBye);//false

        // stu1.sayHello、stu2.sayHello和stu1.sayGoodBye、stu2.sayGoodBye分别使用不同的内存空间，都需要占用资源
        // 但是其输出内容是一致的，为了节省内存空间，希望能够共用


        // 所有函数都有一个prototype属性
        // console.log(Student.prototype);//这个属性值是一个对象，称之为原型对象

        //可以通过prototype来添加新的属性和方法，此时所有该构造函数创建的对象都会具有这些属性和方法
        // 构造函数名称.prototype.属性名=属性值;
        // 构造函数名称.prototype.方法名=函数;
        
        function Student(name,age){
            this.name=name;
            this.age=age;
            this.show=function(){
                console.log("我是一个学生，我的名字："+this.name+",年龄："+this.age);
            };
           
        }
        //可以通过prototype来添加新的属性和方法,并且新增内容为该构造函数所创建的所有对象所共有

        //添加方法
        Student.prototype.sayHello=function(){
            console.log("hello");
        };
        Student.prototype.sayGoodbye=function(){
            console.log("goodbye");
        };
        //添加方法
        Student.prototype.sex="男";
/* 
        访问对象属性时查找顺序：
        1.首先在当前对象中查找
        2.如果没有，就会到该对象关联的构造函数的prototype属性中找，即到原型对象中查找 */


        var stu1=new Student("alice",20);
        stu1.sex="女";//为对象添加一个sex属性
        stu1.show();
        stu1.sayHello();
        stu1.sayGoodbye();

        var stu2=new Student("alice",20);
        stu2.show();
        stu2.sayHello();
        stu2.sayGoodbye();
        console.log(stu1.sayHello===stu2.sayHello);//true
        console.log(stu1.sayGoodbye===stu2.sayGoodbye);//true
        console.log(stu1.sex);//女
        console.log(stu2.sex);//男

        var arrs=new Array();
        console.log(Array.prototype);


        //为数组添加一个共享的方法
        Array.prototype.selectString=function(){
            // console.log(this);//调用该方法的调用者
            var count=0;
            for(var i=0;i<this.length;i++){
                if((typeof this[i])=="string"){
                    count++;
                }
            }
            return count;

        };
        var arrays=[12,34,"aa","vv",89,"cc"];
        var n=arrays.selectString();
        console.log(n);
        var arrs=["dd","d","ss",3,"ddd"];
        console.log(arrs.selectString());

    </script>
</head>
<body>
    
</body>
</html>